<?php
/**
 * 系统核心配置<p/>
 * @catepory 【核心框架】
 * @author zhouhaichao(a)2008.sina.com
 * @version 1.0
 * @copyright (c) 2008
 * @date 2013-2-21
 */

// 系统默认加载的用户配置，系统
$autoload = array("config", "database", "route");

$config = array();

//是不是开发模式，如果是开发模式的话，错误会更加详细
$config['debug'] = false;

// 默认系统控制器
$config['default_controller'] = 'index';
// 系统默认控制方法
$config['default_controller_method'] = 'index';

// 系统默认定义的错误页面
$config['error_page'] = array(
    "404" => "/system/error/404.php",
    "500" => "/system/error/500.php"
);

$config["request"] = "Request";

//页面文件访问控制器
$config["views_renderer"]["controller"] = array(
    "html" => "IncludeViewRenderer",
    "htm" => "IncludeViewRenderer",
    "php" => "PHPViewRenderer",
    "tpl" => "SmartyViewRenderer"
);

/**
 * 系统及用户配置信息
 */
class Config
{

    // 单例模式
    private static $_instance;

    /**
     * 返回单例
     *
     * @return Config
     */
    public static function getInstance()
    {
        if (!(self::$_instance instanceof self)) {
            self::$_instance = new self();
        }
        return self::$_instance;
    }

    // 创建__clone方法防止对象被复制克隆
    public function __clone()
    {
        trigger_error('Clone is not allow!', E_USER_ERROR);
    }

    private $hasLoad = array(); // 已经加载的配置
    public $conf = array();

    private function __construct()
    {
        $this->_load_all_config();
    }

    /**
     * 加载配置信息
     */
    private function _load_all_config()
    {
        global $config, $autoload;
        $this->conf = $config;
        // 自动加载内容
        foreach ($autoload as $al) {
            $this->loadConfig($al);
        }
    }

    /**
     * 加载用户配置信息
     * @param string $configName 配置文件名称，此文件是在家的application下面的文件
     */
    public function loadConfig($configName)
    {
        $configFile = ROOT . "/application/config/$configName.php";
        if (file_exists($configFile)) {
            if (!in_array($configName, $this->hasLoad)) {
                array_push($this->hasLoad, $configName);
                $this->_loadAndMerge($configFile);
            }
        } else {
            exit("the config ($configFile) not found !!");
        }
    }

    /**
     * 加载配置文件并且合并配置项
     *
     * @param file $file
     */
    private function _loadAndMerge($file)
    {
        global $config,$autoload;
        require_once $file;
        if (isset($config)) {
            // 合并配置项
            foreach ($config as $k => $v) {
                if (is_array($v)) {
                    foreach ($v as $k2 => $v2) {
                        $this->conf[$k][$k2] = $v2;
                    }
                } else {
                    $this->conf[$k] = $v;
                }
            }
            return $config;
        }
    }

    /**
     * 返回配置信息</p>
     * 如果配置信息部存在则返回默认信息
     * @param $configName 配置的名称(一级名称)/名称数组（多级名称）
     * @param null $def
     * @return array|null
     */
    public function getConfig($configName, $def = NULL)
    {
        if (is_array($configName)) // 如果是数组则是返回多级配置信息
        {
            // 当前所在级
            $childNodeConfig = $this->conf;

            for ($idx = 0; $idx < count($configName); $idx++) {
                $key = $configName[$idx];
                if (!array_key_exists($key, $childNodeConfig)) {
                    return $def;
                } else {
                    $childNodeConfig = $childNodeConfig[$key];
                }
            }
            return $childNodeConfig;
        } else {
            if (!array_key_exists($configName, $this->conf)) {
                return $def;
            } else {
                return $this->conf[$configName];
            }
        }
    }
}